热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

表字|班级_Java全栈数据库技术:1.数据库之MysqlL上

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java全栈数据库技术:1.数据库之MysqlL上相关的知识,希望对你有一定的参考价值。第一章数据库概述

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java全栈数据库技术:1.数据库之MysqlL上相关的知识,希望对你有一定的参考价值。



第一章 数据库概述

1.1 数据库概述


  • DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。

  • DB:数据库(Database)

  • SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。

  • 如果把数据库比作盘子,那数据就是盘子里的,SQL则是你的筷子

  • 数据库类型:数据库经过几十年的发展,出现了多种类型。目前最常见的数据库模型主要是:关系型数据库和(noSQL)非关系型数据库。

  • mysql:其中的一款关系型数据库管理系统

以下是2020年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名:)

关系型数据库模型是将复杂的数据结构用较为简单的二元关系(二维表)来表示,如图所示。在该类型数据库中,对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。关系型数据库是目前主流的数据库技术,其中具有代表性的数据库管理系统有:Oracle、DB2、SQL Server、MySQL等。

非关系型数据库:

随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS( 社交网络服务 )类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。 例如:redis MongoDB


关系型数据库设计规则


  • 遵循ER模型


    • E entity 代表实体的意思 对应到数据库当中的一张表
    • R relationship 代表关系的意思
  • 具体体现


    • 将数据放到表中,表再放到库中。
    • 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
    • 表具有一些特性,这些特性定义了数据在表中如何存储,类似java和python中 “类”的设计。
    • 表由列组成,我们也称为字段。每个字段描述了它所含有的数据的意义,数据表的设计实际上就是对字段的设计。创建数据表时,为每个字段分配一个数据类型,定义它们的数据长度和字段名。每个字段类似java 或者python中的“实例属性”。
    • 表中的数据是按行存储的,一行即为一条记录。每一行类似于java或python中的“对象”。


1.2 MySQL概述

MySQL数据库最初是由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购。2009年,SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。MySQL之所以受到业界人士的青睐,主要是因为其具有以下几方面优点:


1. 开放源代码

MySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了General Public License,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么MySQL越来越受欢迎的主要原因。


2. 跨平台

MySQL可以在不同的操作系统下运行,简单地说,MySQL可以支持Windows系统、UNIX系统、Linux系统等多种操作系统平台。这意味着在一个操作系统中实现的应用程序可以很方便地移植到其他的操作系统下。


3. 轻量级

MySQL的核心程序完全采用多线程编程,这些线程都是轻量级的进程,它在灵活地为用户提供服务的同时,又不会占用过多的系统资源。因此MySQL能够更快速、高效的处理数据。


4. 成本低

MySQL分为社区版和企业版,社区版是完全免费的,而企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的Oracle、DB2等也是有很大优势的。其实免费的社区版也支持多种数据类型和正规的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了,而对数据库可靠性要求比较高的企业可以选择企业版。


1.3 Mysql软件的卸载、安装和配置

不讲解,用到时百度搜索就行


第二章 MySQL的使用

2.1 MySQL服务的启动

“我的电脑/计算机”–>右键–>“管理”–>“服务”–>启动和关闭MySQL服务

“开始菜单”–>“控制面板”–>“管理工具”–>“服务”–>启动和关闭MySQL

“任务管理器”–>“服务”–>启动和关闭MySQL

或者

命令行(使用命令行的前提需要配置mysql的环境变量)

net start MySQL服务名
net stop MySQL服务名

2.2 客户端连接MySQL

1、命令行客户端:

mysql -h 主机IP地址 -P 端口号 -u 用户名 -p回车
Enter Password:密码


如果访问本机,-h localhost可以省略


如果端口号没有修改,-P 3306可以省略


除了-p与密码之间不要空格外,其他的-h,-P,-u与后面的参数值之间可以有空格


想要连接成功,必须保证服务开启的


2、其他客户端,例如:可视化工具Navicat或SQLyog等


第三章 MySQL数据类型和运算符

3.1 MySQL数据类型


1、数值类型


  • 整型系列:xxxInt3


int(M),必须和unsigned zerofill一起使用才有意义


* 1个字节(byte) = 8比特(bit),可以表示256个数。一个bit就是一位二进制数
* TINYINT:有符号(-128~127);无符号(0~255)
* 其他类似
* int(4)字段仍然可以接收超过4位的整数,因为mysql默认使用的是有符号类型。而在有符号类型的字段中,整数类型设置的宽度不生效。
* int(M),必须和`unsigned zerofill`一起使用才有意义。unsigned zerofill表示无符号字段,不符合要求的地方以0填充,例如:宽度为3,数值为10,则显示为010.当然还是可以接收超过3位的整数

  • 浮点型系列:float,double(或real)


double(M,D):表示最长为M位,其中小数点后D位


例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。



  • 定点型系列:decimal(底层实际上是使用字符串进行存储)


decimal(M,D):表示最长为M位,其中小数点后D位
如果decimal没有指定宽度,则只保留整数,且会对小数四舍五入
如果指定了宽度,则按宽度输出,多出的小数也会按照四舍五入



  • 位类型:bit

字节范围是:1-8,值范围是:bit(1)~bit(64),默认bit(1) 将传入的数值转为二进制存入

用来存储二进制数。对于位字段,直接使用select命令将不会看到结果。可以使用bit()函数进行插入。插入bit类型字段时,使用bit()函数转为二进制值再插入,使用bin()函数进行读取。


2、日期时间类型

日期时间类型:year, date, datetime, timestamp



注意一下每一种日期时间的表示范围


timestamp和datetime的区别:


  • timestamp范围比较小

  • timestamp和时区有关


    • show variables like ‘time_zone’;
    • set time_zone = ‘+9:00’;
  • 表中的第一个非空的timestamp字段如果插入和更新为NULL则会自动设置为系统时间


案例:

create table test2(time1 datetime,time2 timestamp); # 创建表
insert into test2 values(now(),now()); # 插入数据
select * from test2; // 查询数据
+---------------------+---------------------+
| time1 | time2 |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 02:09:52 |
+---------------------+---------------------+
1 row in set (0.01 sec)
insert into test2 values(null,null);
select * from test2;
+---------------------+---------------------+
| time1 | time2 |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 02:09:52 |
| NULL | NULL |
+---------------------+---------------------+
# 修改时区
set time_zone="+9:00";
select * from test2;
+---------------------+---------------------+
| time1 | time2 |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 11:09:52 | # 修改时区后,timestamp日期类型的数据也会自动改变。datetime类型的不会
| NULL | NULL |
+---------------------+---------------------+

3、字符串类型

MySQL中提供了多种对字符数据的存储类型,不同的版本可能有所差异。常见的有:

char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等

在mysql中,单引号和双引号都表示字符串


  • 字符串类型char,varchar(M)


char如果没有指定宽度,默认为1个字符。定长字符串


varchar(M),必须指定宽度。可变字符串



  • binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的。

  • 一般在保存少量字符串的时候,我们会选择char和varchar;而在保存较大文本时,通常会选择使用text或blob系列。blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,会在数据表中留下很大的“空洞”,为了提高性能,建议定期时候用optimize table功能对这类表进行碎片整理。可以使用合成的(Synthetic)索引来提高大文本字段的查询性能,如果需要对大文本字段进行模糊查询,MySql提供了前缀索引。但是仍然要在不必要的时候避免检索大型的blob或text值。

  • enum枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1~255个成员的枚举需要1个字节存储;对于255`65535个成员需要2个字节存储。例如:gender enum(‘男’,‘女’)。一次只能从枚举值中选择一个。

  • set集合类型,可以包含0~64个成员。一次可以从集合中选择多个成员。如果选择了1-8个成员的集合,占1个字节,依次占2个,3个。。8个字节。例如:hoppy set(‘吃饭’,‘睡觉’,‘玩游戏’,‘旅游’),选择时’吃饭,睡觉’或’睡觉,玩游戏,旅游’


4、示例

+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| eid | int(11) | NO | PRI | NULL | auto_increment |
| ename | varchar(20) | NO | | NULL | |
| tel | char(11) | NO | | NULL | |
| gender | char(1) | YES | || |
| salary | double | YES | | NULL | |
| commission_pct | double(3,2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| job_id | int(11) | YES | | NULL | |
| email | varchar(32) | YES | | NULL | |
| mid | int(11) | YES | | NULL | |
| address | varchar(150) | YES | | NULL | |
| native_place | varchar(10) | YES | | NULL | |
| did | int(11) | YES | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
# char varchar练习
create table test2(
name1 char, # 未指定宽度,则只能放一个字符
name2 char(20), # 指定宽度时,与varchar一样。都可以存放宽度以内的字符串,但是char底层是定长的,即只放2个字符底层仍然会占用20个字符的空间
name3 varchar(20) # 必须指定宽度,底层是可变的,即存放多少字符就占用多少空间。只要不超过宽度
);
insert into test2 values("男","嘿嘿","哈哈哈");
select * from test2;
+-------+--------+-----------+
| name1 | name2 | name3 |
+-------+--------+-----------+
|| 嘿嘿 | 哈哈哈 |
+-------+--------+-----------+
# enum练习
create table test2(
sex enum("男","女","不男不女") # 只能在待选项中选择一个值
);
insert into test2 values("不男不女");
select * from test2;
+--------------+
| sex |
+--------------+
| 不男不女 |
+--------------+
insert into test2 values("公");
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
# set练习
create table test2(
// 1.可以选择集合中的一个或多个待选项
// 2.也可以使用数字选择待选项,从左到右依次是1,2,4,8,...(如果是5则表示:第一个和第三个待选项)
habby set("吃饭","睡觉","玩游戏","运动")
);
insert into test2 values("吃饭");
insert into test2 values("吃饭,睡觉");
select * from test2;
+---------------+
| habby |
+---------------+
| 吃饭 |
| 吃饭,睡觉 |
+---------------+
insert into test2 values(4); # 选择第三个待选项
insert into test2 values(12); # 选择第三、第四个待选项。(12=4+8)
select * from test2;
+------------------+
| habby |
+------------------+
| 吃饭 |
| 吃饭,睡觉 |
| 玩游戏 |
| 玩游戏,运动 |
+------------------+

3.2 数据库编码方式

1.查看当前数据库的编码方式

show variables like 'character%';


2.指定编码方式创建数据库

create database 数据库名 CHARSET "utf8";

3.一劳永逸的解决编码问题

1.找到数据库安装目录下的my.ini文件
2.将ini文件中的`default-character-set`设置为`utf8`
3.将ini文件下的`character-set-server`改为`utf8`

第四章 SQL

4.1 MySQL的语法规范和要求

(1)mysql的sql语法不区分大小写



MySQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。


show variables like "coll%"; // 显示mysql的校验规则,查看数据值是否区分大小写
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
/**
\\_ci(大小写不敏感),\\_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
*/

(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号

(3)建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来

(4)数据库和表名、字段名等对象名中间不要包含空格

(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名

(6)标点符号:



必须成对


必须英文状态下半角输入方式


字符串和日期类型可以使用单引号’’


列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略


如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。


(7)SQL脚本中如何加注释



单行注释:#注释内容


单行注释:–空格注释内容 其中–后面的空格必须有


多行注释:/* 注释内容 */


#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;
#创建表格
#create table student info(...); #表名错误,因为表名有空格
create table student_info(...);
#其中name使用``飘号,因为name和系统关键字或系统函数名等预定义标识符重名了。
CREATE TABLE t_stu(
id INT,
`name` VARCHAR(20)
);
select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""

4.2 SQL分类

DDL (Data Definition Language) :数据定义语言,定义库,表结构等,包括create,drop,alter等

DML (Data Manipulation Language) :数据操作语言,增删改查数据,包括insert,delete,update,select等

DQL(Data query Language):数据查询语言 select

DCL(Data Control Language) :数据控制语言,权限,事务等管理。


4.3 DDL(v1.0)

1、查看所有数据库

show databases;

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.01 sec)

2、指定使用某个数据库

use 数据库名;

mysql> use test1;
Database changed

3、创建数据库

create database 数据库名;
create database 数据库名 charset 'utf8'; #在mysql中字符集名称不要使用utf-8
create database 数据库名 charset 'gbk';

create database test2;
Query OK, 1 row affected (0.02 sec)

4、删除数据库

drop database 数据库名;

mysql> drop database test2;
Query OK, 0 rows affected (0.02 sec)

5、查看某个库下的所有表格

show tables ; #前提是前面有use 数据库名;的语句
show tables from 数据库名;

mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| test1 |
| test2 |
+-----------------+
2 rows in set (0.01 sec)

6、创建表格

create table 【数据名.】表名(
字段名1 数据类型,
字段名2 数据类型,
....
);

create table stu(
id int,
name varchar(10)
);

7、删除表格

drop table 【数据库名.]表名称;

mysql> drop table test2;
Query OK, 0 rows affected (0.04 sec)

8、查看某个表结构

describe 【数据库名.]表名称;
desc 【数据库名.]表名称;

mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

9、增加一列

alter table 【数据库名.]表名称 add 【column】 字段名 数据类型;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 first;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 after 另一个字段;

mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
alter table stu add school char(10); # 默认增加到末尾列
alter table stu add sex enum("男","女") first; # 增加到第一列
alter table stu add age int after id; # 增加到id字段后面
mysql> desc stu;
+--------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+-------+
| sex | enum('男','女') | YES | | NULL | |
| id | int | YES | | NULL | |
| age | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| school | char(10) | YES | | NULL | |
+--------+-------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

10、删除一列

alter table 【数据库名.]表名称 drop 【column】 字段名;

alter table stu drop school; # 删除school列字段
mysql> desc stu;
+-------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| sex | enum('男','女') | YES | | NULL | |
| id | int | YES | | NULL | |
| age | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

11、修改列数据类型

alter table 【数据库名.]表名称 modify 【column】 字段名 新数据类型;

alter table stu modify name char(6); # 修改name字段数据类型
mysql> desc stu;
+-------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| sex | enum('男','女') | YES | | NULL | |
| id | int | YES | | NULL | |

推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 深入解析Redis中五大数据类型的实用应用场景与技巧
    本文将深入探讨Redis中五大核心数据类型的实际应用场景与使用技巧。通过详尽的分析和示例,帮助读者理解每种数据类型的特性和最佳实践,内容涵盖广泛,步骤清晰,细节处理得当,旨在为开发者提供全面的指导。 ... [详细]
author-avatar
手机用户2602929277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有